
#include "../types.h"
#include "../call_func.h"


#ifdef _HACK_TEXT_EXT_
#include "../soul.h"
#include "../libgbam/_string.h"
#endif

#include "20160229.h"

typedef struct{
#ifdef UTF8_
	u32		point:30;
	u32		utf8Flag:1;
#else
	u32		point:31;
#endif
	u32		flag:1;						//0x
}txt_point;

typedef struct{
		int*				point;
		unsigned short	code;
}fe_font;

extern	fe_font		fonts[];

extern u32 utf8togbk(void*data);

/**
 * @brief	解码程序
 * @param a0	数据
 * @param a1	目标
 */
void	text_decode(void*a0,void*a1){
	txt_point		*txt;
	txt		=	(txt_point*)&a0;
#if defined(_HACK_TEXT_EXT_)
    struct{
	    struct
	    {
            char*   name;           //人物名
            u16     id;             //人物id
            u8      name_len;
	    }character[8];              //索引为人物的位置
        int     numbers;        //人物数量
        int     current_pos;    //当前显示头像的位置
    }name_buf = {0};
#endif
	if(txt->flag){
		u32		srcu;
		u8*		src;
		u8*		dst;
		u32		codeA;
		u32		codeB;
		srcu	=	txt->point&0x0fffffff;
		src		=	(u8*)srcu;
		dst		=	a1;
		while((codeA=*dst=*src)){
			/*因为只实现了正常字体的gb2312编码,所以要在这里编码转换一下,
			 * 如果遇到ROM不支持的编码,则原版输出
			 * 如果找到方框字,则简单了许多
			 * */
			if(codeA>=0x81){
			    src++;
				codeB	=	*src++;
				if(codeB<0x80){
					*dst++	=	0x83;
					*dst++	=	0x9B;
				}
				else{
					/*遇到ROM里面有此字模的,就转换*/
					u32		code_index;
					code_index	=	codeA;
					code_index	-=	0x81;
					code_index	*=	0x80;
					code_index	+=	(codeB-0x80);	//得出索引
					if(fonts[code_index].code){
						*dst++	=	fonts[code_index].code&0xff;
						*dst++	=	fonts[code_index].code>>0x8;
					}
					else{
						/* */
						*dst++	=	codeA;
						*dst++	=	codeB;
					}
				}
			}
			else/* if(codeA<0x1F)*/{
#if defined(_HACK_TEXT_EXT_)
                //"[艾瑞珂]:测试程序。"

			    /*
			    "%:显示头像5%"
                "[艾瑞珂]:"
                "%:显示头像3%"
                "[塞恩]:"


                "[艾瑞珂]:"
                    "你是怎么来到这里的？"
                "[塞恩]:"
                    "走过来的。"
                "[艾瑞珂]:"
                    "走过来的？"
                "[塞恩]:"
                    "走过来的确有点困难，但是有方法。"
			    */


                if(*src=='[')
                {
                    int name_len = 0;
                    for(;;){
                        if(src[name_len]==']'&&src[name_len + 1]==':'){
                            break;
                        }
                        if(name_len>=0x11){ //
                            name_len=0;
                            break;
                        }
                        name_len++;
                    }
                    if(name_len)
                    {
                        int id;

                        if(name_buf.numbers){
                            int i;
                            for(i=0;i<8;i++)
                            {
//                                if(name_buf.character[i].name_len==(name_len-1)){
//                                }
                                if(name_buf.character[i].name&&name_buf.character[i].name_len)
                                {
                                    if(!memcmp(name_buf.character[i].name,src+1,name_buf.character[i].name_len))
                                    {
                                        int pos;
                                        pos = i + 0x8;      //8~f
                                        dst[0] = pos;
                                        //位置要更改
                                        name_buf.current_pos = pos;

                                        dst++;
                                        src += name_len + 1 + 1;
                                        break;
                                    }
                                }
                            }
                            if(i<8){ //end loop
                                continue;
                            }
                        }
                        for(id=0;id<0x100;id++){
                            int next_cmp_flg = 0;
                            if(character_name_list[id]&&character_name_list[id][0] == src[1])
                            {
                                //src[0] == '['
                                int offset;
                                for(offset=0;offset<(name_len-1);offset++)
                                {
                                    if(character_name_list[id][offset]!=src[1+offset]){
                                        next_cmp_flg = 1;
                                    }
                                }
                                if(next_cmp_flg){
                                    continue;
                                }
                                if(character_name_list[id][offset]=='\0')
                                {
                                    //设置位置
                                    name_buf.numbers ++;
                                    name_buf.character[name_buf.current_pos - 0x8].name = character_name_list[id];
                                    name_buf.character[name_buf.current_pos - 0x8].name_len = (name_len - 1);

                                    //匹配到人物id;写入数据
                                    //"\x10"H(id)"\x01"
                                    dst[0] = 0x10;
                                    dst[1] = id;
                                    dst[2] = 1;
                                    dst += 3;
                                    src += name_len + 1 + 1;
                                    name_len = 0;

                                    break;
                                }
                            }
                        }
                        if(!name_len)
                        {
                            continue;
                        }
                    }
                }
                //"%:替换%"
                 else if(*src=='%')
                 {
                     int name_len = 1;
                     if(src[1]==':')
                     {
                         for(;;){
                             if(src[name_len]=='%'){
                                 break;
                             }
                             if(name_len>=0x20){ //
                                 name_len=0;
                                 break;
                             }
                             name_len++;
                         }
                         if(name_len){
                             //如果存在
                             int id = 0;
                             for(;;id+=2){
                                 if(!text_replace_list[id]){
                                     break;
                                 }
                                 int next_cmp_flg = 0;
                                 if(text_replace_list[id]&&text_replace_list[id][0] == src[2])
                                 {
                                     //src[0] == '%'
                                     //src[1] == ':'
                                     int offset;
                                     for(offset=0;offset<(name_len-2);offset++)
                                     {
                                         if(text_replace_list[id][offset]!=src[2+offset]){
                                             next_cmp_flg = 1;
                                             break;
                                         }
                                     }
                                     if(next_cmp_flg){
                                         continue;
                                     }
                                     if(text_replace_list[id][offset]=='\0')
                                     {
                                         //匹配到人物id;写入数据
                                         //"\x10"H(id)"\x01"
                                         char* cpy_ptr = (char*)text_replace_list[id+1];
                                         while(*cpy_ptr){
                                             if(cpy_ptr[0]>=0x8&&cpy_ptr[0]<=0xf)
                                             {
                                                 //显示头像的位置
                                                 name_buf.current_pos = cpy_ptr[0];//8~0xf
                                             }
                                             else if(cpy_ptr[0]==0x11){
                                                 //关闭头像
                                                 name_buf.character[name_buf.current_pos - 0x8].name = 0;
                                                 name_buf.character[name_buf.current_pos - 0x8].id = 0;
                                                 name_buf.character[name_buf.current_pos - 0x8].name_len = 0;
                                             }
                                             *dst++ = *cpy_ptr++;
                                         }
                                         src += name_len + 1;
                                         name_len = 0;
                                         break;
                                     }
                                 }
                             }
                             if(!name_len)
                             {
                                 continue;
                             }
                         }
                     }
                 }

                if(*src>=0x8&&*src<=0xf)
                {
                    //显示头像的位置
                    name_buf.current_pos = *src;//8~0xf
                }
                else if(*src==0x11){
                    //关闭头像
                    name_buf.character[name_buf.current_pos - 0x8].name = 0;
                    name_buf.character[name_buf.current_pos - 0x8].id = 0;
                    name_buf.character[name_buf.current_pos - 0x8].name_len = 0;
                }

#endif
                *dst++  =   *src++;
				if(codeA==0x10){	//加载头像
					*dst++	=	*src++;
				}
			}
		};
	}
#ifndef UTF8_
	else if(txt->utf8Flag){
		//获得gb2312编码
		//未测试
		u32		srcu;
		u8*		src;
		u8*		dst;
		u32		codeA;
		u32		codeB;
		u32		utf8gb;
		s32		size;
		srcu	=	txt->point&0x0fffffff;
		src		=	(u8*)srcu;
		dst		=	a1;

		while(1){
			//(codeA=*dst=*src++)

			if(!src[0]){
				break;
			}
			else if(src[0]<0x80){
				if(*src<0x20){
					if(src[1]==0x80){
						/*
0480XX 在世界地图载入XX号头像
0580 显示玩家持有金钱数额
0a80 移动头像至最左
0b80 移动头像至偏左
0c80 移动头像至左
0d80 移动头像至右
0e80 移动头像至偏右
0f80 移动头像至最右
1080 移动头像至最最左以至于超出屏幕范围
1180 移动头像至最最右以至于超出屏幕范围
						 */
						if(src[0]==0x4){
							*dst++=*src++;
						}
						*dst++=*src++;
					}
					else if(src[0]==0x10){
						//10 XX 载入XX号头像
						*dst++=*src++;
					}
					*dst++=*src++;
					continue;
				}
				else{
					*dst++ = *src++;
				}
				continue;
			}

			//获得utf的gbk编码
			utf8gb	=	utf8togbk(src);
			size	=	utf8gb>>0x18;
			codeA	=	utf8gb&0xff;
			/*因为只实现了正常字体的gb2312编码,所以要在这里编码转换一下,
			 * 如果遇到ROM不支持的编码,则原版输出
			 * 如果找到方框字,则简单了许多
			 * */
			if(codeA>=0x81){
				//codeB	=	*src++;
				codeB	=	(utf8gb>>8) &0xff;
				if(codeB<0x80){
					*dst++	=	0x83;
					*dst++	=	0x9B;
				}
				else{
					/*遇到ROM里面有此字模的,就转换*/
					u32		code_index;
					code_index	=	codeA;
					code_index	-=	0x81;
					code_index	*=	0x80;
					code_index	+=	(codeB-0x80);	//得出索引
					if(fonts[code_index].code){
						*dst++	=	fonts[code_index].code&0xff;
						*dst++	=	fonts[code_index].code>>0x8;
					}
					else{
						/* */
						*dst++	=	codeA;
						*dst++	=	codeB;
					}
				}
			}
			//实现已经在上面
//			else if(codeA<0x1f){
//				// 一些事件问题
//				*dst++	=	codeA;
//				if(codeA==0x10){
//					*dst++ = *src++;
//				}
//
//			}
			else/* if(codeA<0x1F)*/{
				*dst++	=	codeA;
			}
			src	+=	size;
		};

	}
#endif
	else
	{
		func	*decode_func;
		decode_func	=	(func*)0x30040F0;
		(*decode_func)(a0,a1);
	}
}

